package com.example.rabbitmq.simple;


import com.example.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.*;
import lombok.SneakyThrows;

import java.io.IOException;


/**
 * 消费者
 */
public class Recv {

    public static void main(String[] argv) throws Exception {

        // 获取到连接
        Connection connection = ConnectionUtil.getConnection();



        for (int i = 0; i < 10; i++) {
            Thread thread=new Thread(new Runnable(){
                @SneakyThrows
                @Override
                public void run() {

                    // 创建通道
                    final Channel channel = connection.createChannel();
                    // 声明队列
                    channel.queueDeclare("simple-queue", false, false, false, null);
                    DefaultConsumer consumer = new DefaultConsumer(channel) {
                        // 获取消息，并且处理，这个方法类似事件监听，如果有消息的时候，会被自动调用
                        @Override
                        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                                   byte[] body) throws IOException {
                            try {
                                // body 即消息体
                                String msg = new String(body);
//                    System.out.println(1/0); // 模拟异常  表示消息未正常处理    网络波动。。
                                System.out.println(" [x] received : " + msg + "!"+"  envelope.getDeliveryTag()"+envelope.getDeliveryTag());
                                Thread.sleep(120);
                                //   false   不按照批量删除 来清理队列信息     true  按照批量删除
                                channel.basicAck(envelope.getDeliveryTag(),false);//   手动通知队列 删除消息即可 一般在手动确认ack机制使用
                            } catch (Exception e){
                                e.printStackTrace();  //  第三个参数  false  直接删除消息   true  表示 ：把消息重回队列
                                channel.basicNack(envelope.getDeliveryTag(),false,true);
                            }
                        }
                    };
                    // 监听队列，第二个参数：是否自动进行消息确认。 false 告诉队列不要删除消息   手动处理消息   true 自动删除队列信息
                    channel.basicConsume("simple-queue", false, consumer);
                }
            });
            thread.start();
        }

    }
}
